/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.livro.capitulo3.categoria;

import com.livro.capitulo3.util.HibernateUtil;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;


/**
 *
 * @author ducomin
 */
public class CategoriaDAOHql implements CategoriaDAO {

    private Session sessao;
    private Transaction transacao;

    public void salvar(Categoria categoria) {
        sessao = null;
        transacao = null;
        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            sessao.save(categoria);
            transacao.commit();
        } catch (HibernateException e) {
            System.out.println("Não foi possível inserir a Categoria. Erro: " + e.getMessage());
        } finally {
            try {
                sessao.close();
            } catch (Throwable e) {
                System.out.println("Erro ao fechar a operação de insersão. Mensagem: " + e.getMessage());
            }
        }
    }

    public void atualizar(Categoria categoria) {
       sessao = null;
        transacao = null;
        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            sessao.update(categoria);
            transacao.commit();
        } catch (HibernateException e) {
            System.out.println("Não foi possível alterar a Categoria. Erro: " + e.getMessage());
        } finally {
            try {
                sessao.close();
            } catch (Throwable e) {
                System.out.println("Erro ao fechar a operação de atualização. Mensagem: " + e.getMessage());
            }
        }
    }

    public void excluir(Categoria categoria) {
        sessao = null;
        transacao = null;
        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            sessao.delete(categoria);
            transacao.commit();
        } catch (HibernateException e) {
            System.out.println("Não foi possível excluir a Categoria. Erro: " + e.getMessage());
        } finally {
            try {
                sessao.close();
            } catch (Throwable e) {
                System.out.println("Erro ao fechar a operação de exclusão. Mensagem: " + e.getMessage());
            }
        }
    }

    public Categoria buscaCategoria(Integer codigo) {
        Categoria categoria = null;
        sessao = null;
        transacao = null;
        Query consulta = null;
        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            consulta = sessao.createQuery("from Categoria where categoria = :parametro");
            consulta.setInteger("parametro", codigo);
            categoria = (Categoria) consulta.uniqueResult();
            transacao.commit();
            return categoria;
        } catch (HibernateException e) {
            System.out.println("Não foi possível buscar Categoria. Erro: " + e.getMessage());
        } finally {
            try {
                sessao.close();
            } catch (Throwable e) {
                System.out.println("Erro ao fechar operação de busca. Mensagem: " + e.getMessage());
            }
        }
        return categoria;
    }    

    public List<Categoria> listar() {
        sessao = null;
        transacao = null;
        Query consulta = null;
        List<Categoria> resultado = null;
        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            consulta = sessao.createQuery("from Categoria cat order by cat.categoria");
            resultado = consulta.list();
            transacao.commit();

        } catch (HibernateException e) {
            System.out.println("Não foi possível selecionar categoria. Erro: " + e);
            throw new HibernateException(e);
        } finally {
            try {
                sessao.close();
            } catch (Throwable e) {
                System.out.println("Erro ao fechar operação listar. Mensagem: " + e.getMessage());
            }
        }
        return resultado;
    }
}
